package com.maoning.product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1.整合MyBatis-Plus
 *      1)导入依赖
 *      <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-boot-starter</artifactId>
 *             <version>3.3.2</version>
 *      </dependency>
 *      2)配置
 *          1.配置数据源
 *              1).导入数据库的驱动
 *              <dependency>
 *                  <groupId>mysql</groupId>
 *                  <artifactId>mysql-connector-java</artifactId>
 *                  <version>8.0.17</version>
 *              </dependency>
 *              2).在application.yml配置数据源的相关信息
 *          2.配置MyBatis-Plus:
 *              1).使用@MapperScan
 *              2).告诉MyBatis-Plus,sql映射文件位置
 * 2.逻辑删除
 *      1)配置全局的逻辑删除规则(可省略)
 *      2)配置逻辑删除的组件(高版本可省略)
 *      3)给需要的Bean字段加上逻辑删除注解@TableLogic
 * 3.校验注解JSR303
 *      1)给对应的entity添加想要的校验注解即可.比如notnull或者notblank,还可以在注解后加message属性="xxx"自定义消息
 *      2)还需要给相应的想用后台校验的controller的字段,添加@Validated注解(开启校验功能),方可生效,两处注解一起作用才会生效
 *      3)可以在添加了@valid注解的方法上,添加一个形参,BindingResult来获取校验的响应的结果,比如result.getError()等方法
 *      *)valid注解自带返回mvc的报文,是他自己的形式,如果还想以固定形式返回,则必须用bindingresult把异常取出来自己写
 *      4)可以使用分组校验,比如一个字段新增或者修改有两个不同的方法,他们校验的规则不同,此时我们可以使用分组功能
 *        用法是给校验的字段上面里添加属性groups={},这里必须指定class文件,所以我们专门建一些接口,不需要实现它,只做标记功能
 *        然后还需要在controller的@valided加上分组信息@Validated(value = {ADDGroup.class}) ,但需要注意给他加上分组信息后,
 *        这个方法就只会校验带有分组标记的.如果此时字段上有校验规则,但没有分组标记,他是不会去进行校验的.
 *      5)自定义校验功能:
 *          1.编写一个自定义校验注解
 *          2.编写一个自定义校验器(校验逻辑)
 *          3.关联自定义的校验注解和校验器,案例见brandentity的showStatus
 * 4.统一的异常处理,使用spring自带的@ControllerAdvice
 * *其他的一些小发现!:
 *  1)使用@JsonInclude(JsonInclude.Include.NON_EMPTY)可以让json按照不为空等等条件来进行接收或者返回.
 *    比如查询菜单子集合为空的情况,可以通过上面的注解让空的children不返回出去.前端接的就是彻底的空,而不是一个空的children数组
 *
 * 5.模板引擎
 *  1).引入thymeleaf-stater,关闭缓存
 *  2).静态资源在static文件夹下就可以按路径直接访问
 *  3).页面放在templates下,直接访问
 *
 * 6.整合redis
 *  1).引入data-redis-starter
 *  2).简单配置redis的host等信息
 *  3).使用springboot自动配置号的stringredistemplate来操作redis
 *
 * 7.整合redisson
 *  1).引入依赖,配置redis,参考官方文档,github-->wiki-->点中文的对应文档
 *
 * 8.整合springCache简化开发
 *  1).引入依赖,这里需要2个,spring-boot-starter-redis和spring-boot-starter-cache
 *  2).写配置:
 *      -1.自动配置写了哪些?CacheAutoConfiguration会导入RedisCacheConfiguration,并自动配置好了
 *      缓存管理器RedisCacheManager
 *      -2.需要我们配什么?看项目里的配置文件
 *      -3.测试使用缓存注解:
 *      @Cacheable: 触发缓存填充。
 *      @CacheEvict: 触发缓存删除。
 *      @CachePut: 在不干扰方法执行的情况下更新缓存。
 *      @Caching：重新组合要应用于方法的多个缓存操作。
 *      @CacheConfig：在类级别共享一些常见的缓存相关设置。
 */
@EnableCaching
@SpringBootApplication
@EnableRedisHttpSession
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
